package main

import (
	"fmt"
)

//array slice
func main() {
	fmt.Println("examp12")
	//数组 长度是固定的
	var a [2]int //定义一个数组，默认值是0
	fmt.Println("定义一个数组", a)
	b := [2]int{2, 3} //指定长度，并赋值
	fmt.Println("指定长度，并赋值", b)
	c := [...]int{5, 6, 7, 8} //自动推算长度
	fmt.Println("自动推算长度", c, "使用len函数获得数组长度", len(c))
	d := [...]int{4: 8} //使用索引，索引个数:最后一个索引值
	fmt.Println("使用索引", d)
	d[0] = 2 //通过下标改变值
	fmt.Println("通过下标改变值", d)

	//切片也是数组，长度是可变的
	var s1 []int       //和数组一样，但不指定长度
	s1 = append(s1, 1) //向切片里添加值使用append
	fmt.Println("向切片里添加值使用append", s1)
	fmt.Println(c)
	s2 := c[1:2] //截取数组,开始下标:取几个,这样就变成切片
	fmt.Println("截取数组,开始下标:取几个,这样就变成切片", s2)
	s2 = append(s2, 2)
	fmt.Println("向切片追加数据", s2)

	//切片和数组的截取方式
	s2 = s2[:2] //从0开始截取2个
	fmt.Println("从0开始截取2个", s2)
	s2 = c[2:] //从下标2开始，截取所有
	fmt.Println("从下标2开始，截取所有", s2)
	s2 = c[:] //截取所有,相当于把数组c全截取
	fmt.Println("截取所有", s2)

	//切片和数组的长度 len，空间 cap，make，new
	s3 := new([]int) //使用new创建切片或数组，返回的是指针
	//var aaa *int = new(int)
	fmt.Println("new指针", s3)
	s4 := make([]int, 3, 10) //使用make 创建切片或数组，参数：类型,长度,容量 连续的内存空间
	fmt.Println("make", s4, "len", len(s4), "cap", cap(s4))
	s5 := append(s4, 8)
	s4[0] = 1
	fmt.Println(s5, s4, cap(s5), cap(s4))
	s5 = nil
	for i, v := range s4 {
		fmt.Println(i, v)
	}
}
